#include <iostream>
using namespace std;


//函数业务逻辑一样 
//函数的参数类型不一样
void myswap01(int &a, int &b){
        int c = 0;
        c = a;
        a = b;
        b = c;
}

void myswap02(char &a, char &b){
        char c = 0;
        c = a;
        a = b;
        b = c;
}

//让 类型参数化 === 方便程序员进行编码
//泛型编程
//template 告诉c++编译器 我开始泛型编程了, 看到T 不要随便报错
template <typename T>
void myswap(T &a, T &b){
        T c;
        c = a;
        a = b;
        b = c;
        cout<<"我是模板函数 欢迎 call me "<<endl;
}

int main01(int argc, char const *argv[]){
        {
                int x = 10;
                int y = 20;

                myswap01(x, y);
                printf("x = %d y = %d \n", x, y);
        }

        {
               char a = 'a';
               char b = 'b';
               myswap02(a, b); 
                printf("a = %c b = %c \n", a, b);
        }


        return 0;
}

//函数模板的调用
// 显示类型 调用
// 自动类型 推导
int main02(int argc, char const *argv[])
{
        {
                int x = 10;
                int y = 20;

                //myswap<int>(x, y); // 函数模板 显示类型 调用

                myswap(x, y); //自动类型推导
                printf("x = %d y = %d \n", x, y);
        }

        {
               char a = 'a';
               char b = 'b';
                //myswap<char>(a, b);  // 函数模板 显示类型 调用
                myswap(a, b); //自动类型推导
                printf("a = %c b = %c \n", a, b);
        }
        return 0;
}
